August 15, 2022
AWS Step Functions는 시각화된 워크플로를 통해 분산 애플리케이션 및 마이크로 서비스 컴포넌트의 관리를 돕는 완전 관리형 서비스
기존의 SWF(Amazon Simple Workflow)를 대체하는 용도로 만들어짐
Amazon States 언어는 state machine을 정의하는 데 사용되는 구조화된 JSON 기반 언어
{
"Comment": "An example of the Amazon States Language using a choice state.",
"StartAt": "FirstState",
"States": {
"FirstState": {
"Type": "Task",
"Resource": "arn:aws:lambda:us-east-1:123456789012:function:FUNCTION_NAME",
"Next": "ChoiceState"
},
"ChoiceState": {
"Type": "Choice",
"Choices": [
{
"Variable": "$.foo",
"NumericEquals": 1,
"Next": "FirstMatchState"
},
{
"Variable": "$.foo",
"NumericEquals": 2,
"Next": "SecondMatchState"
}
],
"Default": "DefaultState"
},
"FirstMatchState": {
"Type": "Task",
"Resource": "arn:aws:lambda:us-east-1:123456789012:function:OnFirstMatch",
"Next": "NextState"
},
"SecondMatchState": {
"Type": "Task",
"Resource": "arn:aws:lambda:us-east-1:123456789012:function:OnSecondMatch",
"Next": "NextState"
},
"DefaultState": {
"Type": "Fail",
"Error": "DefaultStateError",
"Cause": "No Matches!"
},
"NextState": {
"Type": "Task",
"Resource": "arn:aws:lambda:us-east-1:123456789012:function:FUNCTION_NAME",
"End": true
}
}
}
워크플로의 Task가 실행되도록 보장
특정 순서로 Lambda를 실행하는 워크플로 생성
특정 로직에서 사용자나 외부 시스템의 응답을 기다려야 하는 경우 Step-functions에서 다음과 같은 로직을 사용할 수 있습니다.
import * as lambda from 'aws-cdk-lib/aws-lambda'
declare const submitLambda: lambda.Function
declare const getStatusLambda: lambda.Function
const submitJob = new tasks.LambdaInvoke(this, 'Submit Job', {
lambdaFunction: submitLambda,
// Lambda's result is in the attribute `Payload`
outputPath: '$.Payload',
})
const waitX = new sfn.Wait(this, 'Wait X Seconds', {
time: sfn.WaitTime.secondsPath('$.waitSeconds'),
})
const getStatus = new tasks.LambdaInvoke(this, 'Get Job Status', {
lambdaFunction: getStatusLambda,
// Pass just the field named "guid" into the Lambda, put the
// Lambda's result in a field called "status" in the response
inputPath: '$.guid',
outputPath: '$.Payload',
})
const jobFailed = new sfn.Fail(this, 'Job Failed', {
cause: 'AWS Batch Job Failed',
error: 'DescribeJob returned FAILED',
})
const finalStatus = new tasks.LambdaInvoke(this, 'Get Final Job Status', {
lambdaFunction: getStatusLambda,
// Use "guid" field as input
inputPath: '$.guid',
outputPath: '$.Payload',
})
const definition = submitJob
.next(waitX)
.next(getStatus)
.next(
new sfn.Choice(this, 'Job Complete?')
// Look at the "status" field
.when(sfn.Condition.stringEquals('$.status', 'FAILED'), jobFailed)
.when(sfn.Condition.stringEquals('$.status', 'SUCCEEDED'), finalStatus)
.otherwise(waitX)
)
new sfn.StateMachine(this, 'StateMachine', {
definition,
timeout: Duration.minutes(5),
})
Branch에 두 State가 있다면,
입력된 데이터를 다음 상태로 전달
Standard Workflow에서 사용할 수 있는 Task의 타입은 아래 3가지
Run a job(.sync)
또는 Wait for Callback(.waitForTaskToken)
를 지원하지 않습니다.Step Functions는 특정 사용 사례에 따라 사용할 수 있는 두 가지 워크플로 유형 제공
장기 실행 워크플로에 이상적
정확히 한 번만 워크플로를 실행
멱등성이 있는 작업을 조정하는 데 이상적
최소 한 번 워크플로를 실행